package leetCode.offer56_i;

import java.util.*;

/**
 * 一个整型数组 nums 里除两个数字之外，其他数字都出现了两次。请写程序找出这两个只出现一次的数字。
 * 要求时间复杂度是O(n)，空间复杂度是O(1)。
 * 示例 1：
 * 输入：nums = [4,1,4,6]
 * 输出：[1,6] 或 [6,1]
 *
 * 示例 2：
 * 输入：nums = [1,2,10,4,1,4,3,3]
 * 输出：[2,10] 或 [10,2]
 *
 * 限制：
 * 2 <= nums.length <= 10000
 *
 */
public class Solution1 implements Solution{


    @Override
    public int[] singleNumbers(int[] nums) {
        // 首先寻找a和b不同的位，
        // 重点在于扎个mask位的查找
        int a_xor_b = nums[0];
        for(int i=1;i<nums.length;i++){
            a_xor_b ^=nums[i];
        }
        int mask = 1;
        while ((a_xor_b&mask)==0){
            mask<<=1;
        }
        // 然后根据这个mask对数组进行分组
        // 然后将分组的整体异或计算得到的分别就是a,b
        int[] result = new int[2];
        int a = 0;
        int b = 0;
        boolean aF = true;
        boolean bF = true;
        for (int num : nums) {
            if ((num & mask) == mask) {
                if (aF) {
                    a = num;
                    aF = false;
                } else a ^= num;
            } else {
                if (bF) {
                    b = num;
                    bF = false;
                } else b ^= num;
            }
        }
        result[0] = a;
        result[1] = b;
        return result;
    }

    public static void main(String[] args) {
        Solution1 solution1 = new Solution1();
        int[] param = {7,1,7,2,6,6,3,1};
        System.out.println(Arrays.toString(solution1.singleNumbers(param)));
    }

}
